package data

import (
	"context"
	"fmt"
	"manage/app/user/internal/biz"
	"time"

	"github.com/Fromsko/gouitls/logs"
	"github.com/go-kratos/kratos/v2/log"

	"gorm.io/gorm"
)

var echo = logs.InitLogger()

type userRepo struct {
	data      *Data
	log       *log.Helper
	UserTable *biz.UserInfo
}

func NewUserRepo(data *Data, logger log.Logger) biz.UserRepo {
	up := &userRepo{
		data: data,
		log:  log.NewHelper(logger),
	}
	up.UserTable = up.Setup()

	return up
}

// Setup 初始化
func (u userRepo) Setup() (userInfo *biz.UserInfo) {
	userInfo = &biz.UserInfo{}

	func(db *gorm.DB) {
		if db.Migrator().HasTable(userInfo) {
			echo.Warn("用户表已存在, 跳过创建。")
			return
		}

		if err := db.AutoMigrate(userInfo); err != nil {
			echo.Errorf("创建表失败：%v", err)
		}

		echo.Info("用户表创建完成")
	}(u.data.Mysql)

	return userInfo
}

// Query NOTE: 查询
func (u userRepo) Query(ctx context.Context, userID string) (*biz.UserInfo, error) {
	/**
	1. 数据库查询是否存在
	2. 返回用户数据
	*/

	user := &biz.UserInfo{}

	result := u.data.Mysql.Where("user_id = ?", userID).Find(user)

	if result.Error != nil {
		return nil, result.Error
	}

	if result.RowsAffected == 0 {
		return nil, fmt.Errorf("用户不存在")
	}

	return user, nil
}

// GetUserByRole 查询数据库中所有具有指定角色的用户数据
func (u userRepo) QueryList(ctx context.Context, role string) ([]biz.UserInfo, error) {
	var users []biz.UserInfo
	if err := u.data.Mysql.Where("role = ?", role).Find(&users).Error; err != nil {
		return nil, err
	}
	return users, nil
}

// Delete NOTE: 删除
func (u userRepo) Delete(ctx context.Context, userID string) (err error) {

	userInfo, err := u.Query(ctx, userID)
	if err != nil {
		return err
	}

	err = u.data.Mysql.Delete(userInfo).Error
	if err != nil {
		return err
	}
	return nil
}

// Update NOTE: 更新
func (u userRepo) Update(ctx context.Context, userInfo *biz.UserInfo) (*biz.UserInfo, error) {

	// 检测是否存在
	if _, err := u.Query(ctx, userInfo.UserID); err != nil {
		return &biz.UserInfo{}, err
	}

	userInfo.UpdatedAt = time.Now()

	// 更新用户数据
	if err := u.data.Mysql.Model(u.UserTable).Where("user_id = ?", userInfo.UserID).Updates(userInfo).Error; err != nil {
		return &biz.UserInfo{}, err
	}

	return userInfo, nil
}

// Create NOTE: 创建
func (u userRepo) Create(ctx context.Context, userInfo *biz.UserInfo) (*biz.UserInfo, error) {

	// 检测是否存在
	if _, err := u.Query(ctx, userInfo.UserID); err == nil {
		return &biz.UserInfo{}, fmt.Errorf("用户已存在")
	}

	// 插入用户记录
	if err := u.data.Mysql.Create(&userInfo).Error; err != nil {
		echo.Errorf("插入用户记录异常: %v", err)
		return userInfo, err
	}
	return userInfo, nil
}
